<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1.先有一个模块构造器
        //   MyModules = {}
        //   define方法和get方法
        //   define方法：遍历deps数组，deps[i] = modules[deps[i]]
        //              modules[name] = impl.apply(impl, deps)
        //   get方法：return modules[name]

        // 2.调用
        //   bar传入 bar里面有一个hello方法 能够接受参数 返回hello方法
        //   foo传入 把bar实例作为参数传入进去 第二个参数写['bar']


        let MyModules = (function () {
            let modules = {}
            function get(name) {
                debugger
                return modules[name]
            }
            function define(name, deps, impl) {
                debugger
                for (let i = 0; i < deps.length; i++) {
                    deps[i] = modules[deps[i]]
                }
                // foo执行这里的时候 deps[i]从 ['bar'] -> [{ hello: hello }]
                modules[name] = impl.apply(impl, deps)
            }
            return {
                get,
                define
            }
        })()
        MyModules.define('bar', [], function () {
            function Hello(who) {
                return 'let me introduce you:' + who
            }
            return {
                Hello: Hello
            }
        })
        MyModules.define('foo', ['bar'], function (bar) {
            let hungry = 'hippo'
            function awesome() {
                console.log(bar.Hello(hungry).toUpperCase())
            }
            return {
                awesome: awesome
            }
        })
        let bar = MyModules.get('bar')
        console.log(bar.Hello('hippo'));
        let foo = MyModules.get('foo')
        foo.awesome()
    </script>
</body>

</html>